home *** CD-ROM | disk | FTP | other *** search
/ PC Media 22 / PC MEDIA CD22.iso / share / prog / spm220e / modem.c < prev    next >
Text File  |  1995-09-13  |  8KB  |  272 lines

  1. /*
  2. ╔═════════════════════════════════════════════════════════════════════════════╗
  3. ║ NAME      : MODEM.C                                                         ║
  4. ║ FUNCTION  : Library to control the used (TeleTex OR HAYES) modem.           ║
  5. ║ REMARKS   : ■ To activate this unit clock interrupt, you have to include the║
  6. ║           : following lines in the main routine:                            ║
  7. ║           :         install_Clock();                                        ║
  8. ║           : Do NOT forget to disactivate it before terminating the program: ║
  9. ║           :         un_install_Clock();                                     ║
  10. ║           : This interrupt will up-date the "connected" variable at each    ║
  11. ║           : second for an HAYES modem. It will also up-date the "C" signal  ║
  12. ║           : into screen to inform the user that he is connected ("ShowCorF" ║
  13. ║           : has to be set TRUE for this...).                                ║
  14. ║           : Please, note that "Check_HModem_State" can't be used to check   ║
  15. ║           : the connect status of the Minitel: The connect status of it     ║
  16. ║           : it must be interpreted by the VideoTex trancoding procedure...  ║
  17. ║           : ■ As an assembler line can be noted in this listing, it is      ║
  18. ║           : necessary to use the TCC assembler to compile it...             ║
  19. ║ COPYRIGHT : HETRU Fabrice 1991-1995.                                        ║
  20. ╚═════════════════════════════════════════════════════════════════════════════╝
  21. */
  22.  
  23.  
  24.  
  25. #include <dos.h>
  26. #include <string.h>
  27.  
  28. #define  byte    unsigned char
  29.  
  30. #define  Int1C   0x1C  /* BIOS interrupt number for the clock interrupt.     */
  31. #define  FALSE   0     /* Logical value for "FALSE".                         */
  32. #define  TRUE    1     /* Logical value for "TRUE".                          */
  33.  
  34. /* Modem type in use: MINITEL ou HAYES ? */
  35. #define  TlTex     0
  36. #define  Hayes     1
  37. /* Command codes to send to the modem.   */
  38. #define  Generique 0
  39. #define  InitMod   1
  40. #define  Connect   2
  41. #define  Appel     3
  42. #define  Raccroch  4
  43. #define  ConnexFin 5
  44.  
  45. /* Variables usefull for the interfacing of this library. */
  46. byte     ModemUsed = Hayes;       /* HAYES modem used by default.            */
  47. byte     DTR_Cmde = TRUE;         /* DTR is used to specify modem commands.  */
  48. byte     HAYESPrefix[4] = {'+','+','+',0}; /* Default HAYES command prefix.  */
  49. byte     PulseDial = TRUE;        /* Pulses calls in use.                    */
  50. byte     connected = FALSE;       /* System is supposed to be not connected. */
  51. byte     Show_CorF = FALSE;       /* No connect status signal to write.      */
  52. byte     ItClk_active = FALSE;    /* The clock interrupt is NOT in use yet...*/
  53.  
  54. /* Modems codes and specials controls commands,         */
  55. /* which may possibly be adaptated...                   */
  56. /* The 0 byte seted at the end of each code is COMPULSO-*/
  57. /* -RY so that the codes may be managed using the C     */
  58. /* string operators.                                    */
  59. char     Esc[2] = {0x1B,0};
  60. char     Sep[2] = {0x13,0};
  61. char     Pro1[2] = {0x39,0};
  62. char     Cod1[2] = {0x67,0};
  63. char     Cod2[2] = {0x68,0};
  64. char     Cod3[2] = {0x49,0};
  65. char     HayesCod[3] = "AT";
  66. char     PulsD[2] = {'P',0};
  67. char     FreqD[2] = {'T',0};
  68. char     HayesInit[17] = " Z0 &D1 X0 V2 B2";
  69. char     HayesConnect[2] = "D";
  70. char     HayesDeconnex[3] = "H0";
  71. char     Lfeed[2] = {0x0D,0};
  72.  
  73. /* General internals variables. */
  74. union    REGS inregs,outregs;
  75. struct   SREGS segregs;
  76. int      Curs_C = 0x7043;
  77. int      Curs_F = 0x7046;
  78. unsigned int seg_ecran;
  79.  
  80.  
  81.  
  82. #include "STARINTF.C"
  83.  
  84.  
  85. void Beep(int Freq, int Tempo)
  86.   {
  87.   sound(Freq);
  88.   delay(Tempo);
  89.   nosound();
  90.   }
  91.  
  92.  
  93. void CmdeToModem(byte TypCmde, char *DataCmde)
  94.   {
  95.   char Chaine_CMDE[30];
  96.   unsigned int Nb_transmited;
  97.   byte Sended;
  98.  
  99.   Nb_transmited = 0;
  100.   strcpy(Chaine_CMDE,'');
  101.   switch (ModemUsed)
  102.     {
  103.     case TlTex:
  104.       {
  105.       strcpy(Chaine_CMDE,Esc);
  106.       switch (TypCmde)
  107.         {
  108.         case Generique:
  109.           { strcat(Chaine_CMDE,Pro1); strcat(Chaine_CMDE,Cod1); break; }
  110.         case InitMod:
  111.           { strcpy(Chaine_CMDE,''); break; }
  112.         case Connect:
  113.           { strcat(Chaine_CMDE,Pro1); strcat(Chaine_CMDE,Cod2); break; }
  114.         case Appel:
  115.           { strcpy(Chaine_CMDE,''); break; }
  116.         case Raccroch:
  117.           { strcat(Chaine_CMDE,Pro1); strcat(Chaine_CMDE,Cod1); break; }
  118.         case ConnexFin:
  119.           {
  120.           if (connected)
  121.             {
  122.             strcat(Chaine_CMDE,Sep);
  123.             strcat(Chaine_CMDE,Cod3);
  124.             }
  125.           else
  126.             {
  127.             strcat(Chaine_CMDE,Pro1);
  128.             strcat(Chaine_CMDE,Cod2);
  129.             }
  130.           }
  131.         }
  132.       if (strlen(Chaine_CMDE)>0)
  133.         {
  134.         strcat(Chaine_CMDE,Lfeed);
  135.         if (WriteSerie(Chaine_CMDE,strlen(Chaine_CMDE),&Nb_transmited)!=0)
  136.           Beep(500,500);
  137.         }
  138.       break;
  139.       }
  140.     case Hayes:
  141.       {
  142.       if (TypCmde!=Generique) strcat(Chaine_CMDE,HayesCod);
  143.       switch (TypCmde)
  144.         {
  145.         case Generique: { strcat(Chaine_CMDE,DataCmde); break; }
  146.         case InitMod:
  147.           {
  148.           strcat(Chaine_CMDE,HayesInit);
  149.           break;
  150.           }
  151.         case Connect:
  152.           {
  153.           strcat(Chaine_CMDE,HayesConnect);
  154.           break;
  155.           }
  156.         case Appel:
  157.           {
  158.           if (connected | (DataCmde==''))
  159.             strcpy(Chaine_CMDE,'');
  160.           else
  161.             {
  162.             strcat(Chaine_CMDE,HayesConnect);
  163.             if (PulseDial) strcat(Chaine_CMDE,PulsD);
  164.               else strcat(Chaine_CMDE,FreqD);
  165.             strcat(Chaine_CMDE,DataCmde);
  166.             }
  167.           break;
  168.           }
  169.         case Raccroch: { strcat(Chaine_CMDE,HayesDeconnex); break; }
  170.         case ConnexFin: if (connected) strcat(Chaine_CMDE,HayesDeconnex);
  171.                      else strcat(Chaine_CMDE,HayesConnect);
  172.         }
  173.       if (strlen(Chaine_CMDE)>0)
  174.         {
  175.         if (!DTR_Cmde)
  176.           {
  177.           if (connected)
  178.             {
  179.             delay(1000);
  180.             Sended = WriteCmde(HAYESPrefix,strlen(HAYESPrefix),DTR_Cmde);
  181.             if (Sended==0) delay(1000);
  182.             }
  183.           else Sended = 0;
  184.           }
  185.         else Sended = 0;
  186.         if (Sended==0)
  187.           {
  188.           strcat(Chaine_CMDE,Lfeed);
  189.           if (WriteCmde(Chaine_CMDE,strlen(Chaine_CMDE),DTR_Cmde)!=0)
  190.             Beep(500,500);
  191.           if (connected)
  192.             {
  193.             delay(1200);
  194.             strcpy(Chaine_CMDE,"ATO");
  195.             strcat(Chaine_CMDE,Lfeed);
  196.             Sended = WriteCmde(Chaine_CMDE,strlen(Chaine_CMDE),FALSE);
  197.             }
  198.           }
  199.         }
  200.       }
  201.     }
  202.   }
  203.  
  204.  
  205. static void interrupt (*OldIClk) ();
  206.  
  207.  
  208. void interrupt Check_HModem_State()
  209.   {
  210.   static byte compteur = 0;
  211.   char mod_scr;
  212.  
  213.   /* Up-date at each second... */
  214.   compteur++;
  215.   if ( (compteur>=0x12) & (!ItClk_active) )
  216.     {
  217.     /* No multiple entrance in this area ! */
  218.     ItClk_active = TRUE;
  219.  
  220.     /* 8259 and CPU acquittance to allow the serial receipts... */
  221.     outportb(0x20,0x20);
  222.     enable();
  223.  
  224.     /* Checking the connect status. */
  225.     etat_du_modem();
  226.     connected=Porteuse;
  227.  
  228.     /* Writting the "C" or "F" alert into screen. */
  229.     if (Show_CorF)
  230.       {
  231.       mod_scr = peekb(0x40,0x49);
  232.       if (connected)
  233.         {
  234.         if ( (mod_scr==2) | (mod_scr==3) | (mod_scr==7) )
  235.           poke(seg_ecran,158,Curs_C);
  236.         else poke(seg_ecran,76,Curs_C);
  237.         }
  238.       else
  239.         {
  240.         if ( (mod_scr==2) | (mod_scr==3) | (mod_scr==7) )
  241.           poke(seg_ecran,158,Curs_F);
  242.         else poke(seg_ecran,76,Curs_F);
  243.         }
  244.       }
  245.  
  246.     /* That's the end of our clock interrupt. */
  247.     ItClk_active = FALSE;
  248.     compteur = 0;
  249.     }
  250.  
  251.   /* Call to the previous clock interrupt */
  252.   asm pushf
  253.   (*OldIClk) ();
  254.   }
  255.  
  256.  
  257. void install_Clock()
  258.   {
  259.   inregs.h.ah = 0x0F;
  260.   int86(0x10,&inregs,&outregs);
  261.   if (outregs.h.al==7) seg_ecran = 0xB000;
  262.     else seg_ecran = 0xB800;
  263.   OldIClk = getvect(Int1C);
  264.   setvect(Int1C,Check_HModem_State);
  265.   }
  266.  
  267.  
  268. void un_install_Clock()
  269.   {
  270.   setvect(Int1C,OldIClk);
  271.   }
  272.